package com.zkh.myutils.system;

import java.io.File;
import java.net.URL;
import java.util.Map;

import com.zkh.myutils.code.CoderUtils;
import com.zkh.myutils.io.file.FileUtils;
import com.zkh.myutils.utils.Regexp;
import com.zkh.myutils.utils.StringUtils;

/**
 * 初始化日志Bean
 * @author zkh
 */
public class LogConfigBean {
	//日志类型，可选值：console,file。file代表同时输出到控制台和文件
	private String logType = "console";
	//输出级别，可选值：debug, info, warn, error，级别依次增高。低级别包含高级别。
	private String logLevel = "debug";
	//日志保存目录，以“/”或“[c-z]:”开始的，为绝对路径；其它情况开头的，为相对于项目的目录。
	private String logFilePath;
	//日志文件名称格式，括号中为解析当前日期的pattern。
	//如果未检测到日期pattern，即“{}”，则为固定日志文件，而非按日期分别保存。
	private String logFileName = "log_{yyyyMMdd}";
	
	//日志文件存放目录
	private File logFileDir;
	//日志文件名称日期规则
	private String logFileNameDatePattern = "yyyyMMdd";
	
	/**
	 * 构造方法
	 * @param config 配置，由文件读取
	 */
	public LogConfigBean(Map<String, String> config) {
		//获取值并检查格式
		/** 日志类型 **/
		String logType = config.get("logType");
		//检查日志类型
		if(StringUtils.isExist(logType, true, "console", "file")) {
			this.logType = logType.toLowerCase();
		}
		
		/** 日志级别 **/
		String logLevel = config.get("logLevel");
		//检查日志级别
		if(StringUtils.isExist(logLevel, true, "debug", "info", "warn", "error")) {
			this.logLevel = logLevel.toLowerCase();
		}
		
		/** 日志文件目录 **/
		if(!"console".equals(logType)) {
			logFilePath = config.get("logFilePath");
			//为空，给默认值
			if(StringUtils.isEmpty(logFilePath)) {
				logFilePath = "logs/";
			}
			//处理相对目录。以“/”或“[c-z]:”开始的，为绝对路径，其它为相对目录
			if(!logFilePath.startsWith("/") && !logFilePath.matches("^[c-zC-Z]:.+")) {
				//获取资源
				URL url = ClassLoader.getSystemClassLoader().getResource("");
				//获取路径（如果url为null，则当前是个jar包）
				String path = url==null ? new File("").getAbsolutePath() : CoderUtils.decodeURL(url.getFile());
				//确保末尾以/结尾
				if(!path.endsWith("/")) {
					path += "/";
				}
				//保存路径
				logFilePath = path + logFilePath;
			}
			//生成目录File对象
			logFileDir = new File(logFilePath);
			//调试
			System.out.println("已设置日志文件根目录：" + logFileDir.getAbsolutePath());
			//不存在，则创建
			FileUtils.mkdirs(logFileDir);
		}
		
		/** 日志文件名称格式 **/
		String logFileName = config.get("logFileName");
		//不为空，则保存
		if(StringUtils.isNotEmpty(logFileName)) {
			//文件名
			this.logFileName = logFileName;
			//提取日期规则并保存
			logFileNameDatePattern = Regexp.getMatchOne("(?<=\\{).+(?=\\})", logFileName);
		}
	}
	
	/** 提供getter **/
	/**
	 * 获取日志类型。可选值：console,file,both
	 */
	public String getLogType() {
		return logType;
	}

	/**
	 * 获取日志级别。可选值：debug, info, warn, error
	 */
	public String getLogLevel() {
		return logLevel;
	}
	
	/**
	 * 获取日志保存目录
	 */
	public File getLogFileDir() {
		return logFileDir;
	}

	/**
	 * 获取日志文件名称格式，括号中为解析当前日期的pattern。
	 */
	public String getLogFileName() {
		return logFileName;
	}
	
	/**
	 * 日志文件名称日期规则
	 */
	public String getLogFileNameDatePattern() {
		return logFileNameDatePattern;
	}

	@Override
	public String toString() {
		return "InitLogBean [logType=" + logType + ", logLevel=" + logLevel
				+ ", logFilePath=" + logFilePath + ", logFileName="
				+ logFileName + ", logFileDir=" + logFileDir
				+ ", logFileNameDatePattern=" + logFileNameDatePattern + "]";
	}
}
